VBA学习笔记71: Select多表查询 | 您所在的位置:网站首页 › vba的select case › VBA学习笔记71: Select多表查询 |
学习资源:《Excel VBA从入门到进阶》第73集 by兰色幻想 之前讲的都是单表查询,这节来学习多表查询。 首先做的还是创建类模块,把打开数据库、复制筛选后的数据到单元格区域和关闭数据库的代码,以便后续可直接调用和增加代码可读性。 Sub 执行筛选(sq, Rg As String) 'sq是SQL语句,Rg是搜索结果粘贴的位置 Dim conn As New Connection With ActiveSheet .Range(Rg).Resize(100, 7) = "" conn.Open "provider=microsoft.jet.oledb.4.0;extended properties=excel 8.0;data source=" & ThisWorkbook.FullName .Range(Rg).CopyFromRecordset conn.Execute(sq) End With conn.Close Set conn = Nothing End Sub下面开始正式内容: 一、多个select查询结果合并 Union all例1:合并下面两个表格的A-C列。 如果不写union all 中的all呢? Sub 合并工作表数据2() Dim data As New 类1 Dim sql As String sql = "select * from [Sheet1$a:c] union select * from [sheet2$a:c]" data.执行筛选 sql, "a2" End Sub由此可以看出,all在这里面的作用,是获取查询的全部数据,而不写all,程序会忽略重复数值部分。 这里举例是查询合并两个表格,如果需要合并更多,可以使用循环语句。 那么想获取相同类别的汇总应该怎么做呢? ——利用子查询。 先用union all对表格进行子查询,然后再对子查询进行汇总求和,最后才输出。注意子查询要用括弧和双引号括起来。 Sub 汇总() Dim data As New 类1 Dim sql As String Dim sq As String sql = "select * from [sheet1$a:c] union all select * from [sheet2$a:c]" '子查询 sq = "select 类别,sum(数量),sum(金额) from (" & sql & ") group by 类别" '对子查询进行汇总求和合并 data.执行筛选 sq, "a2" End Sub二、查询两个表中相同的字段数据 select……from……where……Select 字段 from 表1,表2 where 表1.字段=表2.字段例2:合并上列两个表中类别相同的数据。 Sub 列出相同() Dim data As New 类1 Dim sql As String sql = "select [Sheet1$a:c].* from [Sheet1$a:c],[Sheet2$a:c] where [Sheet1$a:c].类别=[Sheet2$a:c].类别" data.执行筛选 sql, "a2" End Sub2. Join Join有四种用法: ①JOIN: 如果表中有至少一个匹配,则返回行 ②LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行 ③RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行 ④FULL JOIN: 只要其中一个表中存在匹配,就返回行,可惜的是在EXCEL VBA中不支持 首先来看看①的使用: Select 字段 from 表1 Inner Join 表2 on 条件还是使用上例,where换成Inner Join……on…… Sub 列出相同2() Dim data As New 类1 Dim sql As String sql = "select [Sheet1$].*,[sheet2$].* from [Sheet1$] Inner Join [sheet2$] on [Sheet1$].类别=[sheet2$].类别" data.执行筛选 sql, "a2" End Sub表二应该写与表一不一样的字段名,不能直接用*通配符匹配全部。 sql = "select [Sheet1$].*,[sheet2$].库别 from [Sheet1$] Inner Join [sheet2$] on [Sheet1$].类别=[sheet2$].类别"② LEFT JOIN & RIGHT JOIN LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行例:接例1 Sub 合并() Dim data As New 类1 Dim sql As String sql = "select [Sheet1$].*,[sheet2$].库别 from [Sheet1$] left Join [sheet2$] on [Sheet1$].类别=[sheet2$].类别" data.执行筛选 sql, "a2" End Sub改成right join: sql = "select [Sheet1$].*,[sheet2$].库别 from [Sheet1$] right Join [sheet2$] on [Sheet1$].类别=[sheet2$].类别"但如果想实现无论是哪个表格有,都显示出来,只有FULL JOIN可实现,但VBA不支持...... 下一节是综合实例了,SQL还有两节课,整个VBA教学还有7节课就结束啦! |
今日新闻 |
推荐新闻 |
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 |